package wiinf;

import java.io.IOException;

import java.util.HashMap;
import java.util.Vector;

/**
 *
 * @author Randy van Heijst & David Roos
 */
public class serverController {
    protected fileHandler fh;
    protected serverViewModel model;
    protected RemoteDeviceDiscovery dd;
    protected int messageType;
    protected Vector vecDevices = new Vector();
    protected serverSender ss;
    protected Thread thread;

    /**
     *
     * @param model De meegegeven user interface
     * @throws IOException
     */
    public serverController(serverViewModel model) {
        this.model = model;
        fh = new fileHandler();
    }

    /**
     * Roept de fileHandler aan om een afdeling aan te maken en geeft een status bericht aan de user interface
     *
     * @param naam De afdeling naam
     */
    public void setAfdeling(String naam) {
        if (fh.createMap(naam)){
            String message = "Afdeling " + naam + " is toegevoegd!";
            model.setMessage(message, 3);
        }else {
            String message = "Afdeling " + naam + " bestaat al!";
            model.setMessage(message, 2);
        }
    }

    /**
     * Roept de fileHandler aan om een afdeling naam te wijzigen en geeft een status bericht aan de user interface
     *
     * @param item Oude naam van de afdeling
     * @param naam Nieuwe naam van de afdeling
     */
    public void updateMap(String item, String naam){
        String message = "";
        //Controleer of er wel iets gewijzigd moet worden
        if (item.equals(naam)){
            message = "Er vind geen wijziging plaats in de naam van afdeling " + item + "!";
            model.setMessage(message, 2);
            return;
        }

        if (fh.updateMap(item, naam)){
            message = "Afdeling " + item + " is hernoemd naar " + naam + ".";
            model.setMessage(message, 3);
        } else {
            message = "Afdeling " + naam + " bestaat al!";
            model.setMessage(message, 2);
        }
    }

    /**
     * Roept de fileHandler aan om een afdeling te verwijderen en geeft een status bericht aan de user interface
     *
     * @param naam Naam van de te verwijderen afdeling
     */
    public void deleteMap(String naam){
        if (fh.deleteMap(naam)) {
            String message = "Afdeling " + naam + " verwijderd";
            model.setMessage(message, 3);
        }else {
            String message = "Afdeling " + naam + " bevat nog opleidingen";
            model.setMessage(message, 2);
        }
    }

    /**
     * Roept fileHandler aan om de opleiding aan te maken en geeft een status bericht aan de user interface
     *
     * @param afdeling De afdeling waar de opleiding bij hoort
     * @param naam De naam van de toe te voegen opleiding
     * @param data Array met daarin de data van de opleiding
     */
    public void createOpleiding(String afdeling, String naam, String[] data) {
        if(fh.writeXML(afdeling, naam, data)) {
            String message = "Opleiding " + naam + " aangemaakt.";
            model.setMessage(message, 3);
        }
        else {
            String message = "Opleiding " + naam + " bestaat al!";
            model.setMessage(message, 2);
        }
    }

    /**
     * Bewerken van de opleiding
     *
     * @param naamOud Oude naam van de opleiding
     * @param naamNieuw Nieuwe naam van de opleiding
     * @param afdelingOud Naam van de oude afdeling
     * @param afdelingNieuw Naam van de nieuwe afdeling
     * @param data Informatie van de opleiding
     */
    public void updateOpleiding(String naamOud, String naamNieuw, String afdelingOud, String afdelingNieuw, String[] data) {
        if(fh.updateOpleiding(naamOud, naamNieuw, afdelingOud, afdelingNieuw, data)) {
            String message = "Opleiding " + naamOud + " is gewijzigd.";
            model.setMessage(message, 3);
        }
        else {
            String message = "Opleiding " + naamOud + " is niet gewijzigd.";
            model.setMessage(message, 2);
        }
    }

    /**
     * Verwijderen van de opleiding
     *
     * @param afdeling Afdeling waar de opleiding in zit
     * @param opleiding De te verwijderen opleiding
     */
    public void deleteOpleiding(String afdeling, String opleiding) {
        if(fh.deleteOpleiding(afdeling, opleiding)) {
            String message = "Opleiding " + opleiding + " is verwijderd";
            model.setMessage(message, 3);
        }
        else {
            String message = "Opleiding " + opleiding + " is niet verwijderd";
            model.setMessage(message, 2);
        }
    }
    /**
     * Maakt een nieuwe serverSender aan van waaruit de cliënts worden bereikt
     *
     * @throws java.io.IOException
     * @throws java.lang.InterruptedException
     */
    public void serverSender() throws IOException, InterruptedException{
        Runnable runnable =  new serverSender(this);
        thread = new Thread(runnable);
        thread.start();

    }

    public void stopThread() {
        thread.stop();
    }

    /**
     * Maakt een nieuwe listener aan om naar cliënts te luisteren
     *
     * @throws java.io.IOException
     * @throws java.lang.InterruptedException
     */
    public void serverListener() throws IOException, InterruptedException{
        Runnable runnable1 =  /*new serverListener();*/ new wiinf.ServerlistenerSPPtest();
        Thread thread12 = new Thread(runnable1);
        thread12.start();
    }

    /**
     * Vul de vector met gevonden cliënt adressen
     *
     * @param devicesDiscovered Vector met gevonden adressen
     * @throws java.io.IOException
     */
    public void setVector(Vector devicesDiscovered) throws IOException {
        vecDevices = devicesDiscovered;
    }

    /**
     * Haal de vector met cliënt adressen op
     *
     * @return De vector gevuld met cliënt adressen
     */
    public Vector getVector() {
        return this.vecDevices;
    }

    /**
     * Krijgt informatie over de opleidingen waar de cliënt informatie over wil, en roept de fileHandler aan om de XML file te maken
     *
     * @param address Bluetooth adres van de cliënt
     * @param input Array van strings met daarin de afdeling en opleidingen waar de cliënt informatie van wil
     */
    public synchronized void createSelection(String address, String[] input) {
        HashMap<String, Vector> hm = new HashMap();
        
        for(int i = 0; i < input.length; i++) {
            Vector v = new Vector();
            String[] s = input[i].split(" - ");

            if(hm.containsKey(s[0])) {
                v = hm.get(s[0]);
            }
            v.add(s[1]);
            hm.put(s[0], v);
        }
        fh.createClientXML(address, hm);
    }
}
